﻿namespace GSC.WebControls.ComponentModel.Design
{
    using System;
    using System.Globalization;
    using System.Resources;
    using System.ComponentModel;
    /// <summary>
    /// 设计器本地化分组。
    /// </summary>
    /// <remarks>设计器本地化分组。</remarks>
    [AttributeUsageAttribute(AttributeTargets.All, AllowMultiple = false, Inherited = true)]
    public class SRCategoryAttribute : CategoryAttribute
    {
        /// <summary>
        /// 
        /// </summary>
        ResourceManager resourceManager;
        /// <summary>
        /// 初始化。
        /// </summary>
        /// <remarks>初始化。</remarks>
        /// <param name="category">设置初始化设计器分组名称。</param>
        public SRCategoryAttribute(string category) : base(category) { this.resourceManager = null; }
        /// <summary>
        /// 查阅指定类别的本地化名称。
        /// </summary>
        /// <remarks>查阅指定类别的本地化名称。</remarks>
        /// <param name="value"></param>
        /// <returns>string</returns>
        protected override string GetLocalizedString(string value)
        {
            //创建资源管理。
            if (this.resourceManager == null)
                this.resourceManager = new ResourceManager(typeof(CategoryAttributeResource));
            //声明返回值。
            string categoryName = null;
            //验证资源查询对象。
            for (CultureInfo culture = CultureInfo.CurrentCulture; categoryName == null && culture != CultureInfo.InvariantCulture; culture = culture.Parent)
            {
                //获取找到的对象值。
                categoryName = (string)resourceManager.GetObject(value, culture);
            }
            //验证是否为空对象。
            if (string.IsNullOrEmpty(categoryName))
            {
                //重载基类查找资源。
                return base.GetLocalizedString(categoryName);
            }
            //返回值。
            return categoryName;
        }
        /// <summary>
        /// 初始化。
        /// </summary>
        /// <remarks>初始化。</remarks>
        /// <param name="category">设置初始化设计器分组名称。</param>
        /// <param name="resourceSource">指定的 Type 中的信息在附属程序集内查找资源。</param>
        public SRCategoryAttribute(string category, Type resourceSource)
            : base(category) { this.resourceManager = new ResourceManager(resourceSource); }
        /// <summary>
        /// 初始化。
        /// </summary>
        /// <remarks>初始化。</remarks>
        /// <param name="category">设置初始化设计器分组名称。</param>
        /// <param name="baseName">资源的根名称。例如，名为“MyResource.en-US.resources”的资源文件的根名称为“MyResource”。</param>
        /// <param name="classAssembly">类类型对象。</param> 
        public SRCategoryAttribute(string category, string baseName, Type classAssembly)
            : base(category) { this.resourceManager = new ResourceManager(baseName, System.Reflection.Assembly.GetAssembly(classAssembly)); }
        /// <summary>
        /// 初始化。
        /// </summary>
        /// <remarks>初始化。</remarks>
        /// <param name="category">设置初始化设计器分组名称。</param>
        /// <param name="baseName">资源的根名称。例如，名为“MyResource.en-US.resources”的资源文件的根名称为“MyResource”。</param>
        /// <param name="classAssembly">类类型对象。</param> 
        /// <param name="usingResourceSet">要使用的自定义 ResourceSet 的 Type。如果为 nullNothingnullptrnull 引用（在 Visual Basic 中为 Nothing），则使用默认的运行时 ResourceSet。</param> 
        public SRCategoryAttribute(string category, string baseName, Type classAssembly, Type usingResourceSet)
            : base(category)
        {
            this.resourceManager = new ResourceManager(baseName, System.Reflection.Assembly.GetAssembly(classAssembly), usingResourceSet);
        }
    }
}